//package com.ygl.example.service.rule;
//
//import com.alibaba.cloud.nacos.ribbon.NacosServer;
//import com.netflix.client.config.IClientConfig;
//import com.netflix.loadbalancer.*;
//import com.ygl.common.entity.RuleEntity;
//import com.ygl.common.entity.StrategyEntity;
//import com.ygl.common.util.StringUtil;
//import com.ygl.core.cache.RuleCache;
//import org.apache.commons.lang3.StringUtils;
//import java.util.List;
//import java.util.Map;
//
//public class DiscoveryEnabledZoneAvoidancePredicate extends ZoneAvoidancePredicate{
//
//    public DiscoveryEnabledZoneAvoidancePredicate(IRule rule, IClientConfig clientConfig) {
//        super(rule, clientConfig);
//    }
//
//    public DiscoveryEnabledZoneAvoidancePredicate(LoadBalancerStats lbStats, IClientConfig clientConfig) {
//        super(lbStats, clientConfig);
//    }
//
//    @Override
//    public boolean apply(PredicateKey input) {
//        if (!super.apply(input)) {
//            return false;
//        }
//        Server server = input.getServer();
//        boolean enabled = applyVersion(server);
//        if (!enabled) {
//            return false;
//        }
//        return true;
//    }
//
//    private boolean applyVersion(Server server) {
////        RequestAttributes requestAttributes = RequestContextHolder.getRequestAttributes();
////        ServletRequestAttributes attributes = (ServletRequestAttributes)requestAttributes;
////        HttpServletRequest previousRequest = attributes.getRequest();
////        Enumeration<String> headerNames = previousRequest.getHeaderNames();
////        System.out.println("------- Intercept Input Header Information -------");
////        String myVersion = previousRequest.getHeader("version");
////        // 版本一调用版本一。同一版本之间可以调用
////        Map<String, String> serverMetadata = getServerMetadata(server);
////        if (serverMetadata != null) {
////            String targetversion = serverMetadata.get("version");
////            if (StringUtils.equals(targetversion,myVersion)) {
////                return true;
////            }
////        }
////        return false;
//        String versionValue = getGlobalRouteVersion();
//        if (StringUtils.isEmpty(versionValue)) {
//            return true;
//        }
//
//        Map<String, String> serverMetadata = getServerMetadata(server);
//        String version = serverMetadata.get("version");
//
//        String versions = versionValue;
//
//        if (StringUtils.isEmpty(versions)) {
//            return true;
//        }
//
//        // 如果精确匹配不满足，尝试用通配符匹配
//        List<String> versionList = StringUtil.splitToList(versions, ";");
//        if (versionList.contains(version)) {
//            return true;
//        }
//
//        // 通配符匹配。前者是通配表达式，后者是具体值
////        for (String versionPattern : versionList) {
////            if (discoveryMatcherStrategy.match(versionPattern, version)) {
////                return true;
////            }
////        }
//
//        return false;
//    }
//
//    private RuleCache ruleCache;
//
//    public void setRuleCache(RuleCache ruleCache) {
//        this.ruleCache = ruleCache;
//    }
//
//    public String getGlobalRouteVersion() {
////        RuleEntity ruleEntity = ruleCache.get("rule");
////        if (ruleEntity != null) {
////            StrategyEntity strategyEntity = ruleEntity.getStrategyEntity();
////            if (strategyEntity != null) {
////                return strategyEntity.getVersionValue();
////            }
////        }
//        return null;
//    }
//
//    public Map<String, String> getServerMetadata(Server server) {
//        if (server instanceof NacosServer) {
//            NacosServer nacosServer = (NacosServer) server;
//
//            return nacosServer.getMetadata();
//        }
//        return null;
//    }
//}
